#ifndef HTTPDOWNLOAD_H
#define HTTPDOWNLOAD_H


#include <QNetworkReply>
#include <QFile>


class HTTPDownload : public QObject
{
    Q_OBJECT

signals:
    //升级完毕
    //errorType是错误类型，为1是客户端，为0是服务端
    void s_finished(int errorType, QNetworkReply::NetworkError error, int status_code);  //下载完成，用的是 QNetworkAccessManager 的信号


public:
    explicit HTTPDownload(QObject *parent = nullptr);
    virtual ~HTTPDownload();


    //下载url（单个），保存到localpath(含文件名，缺省则根据url的 路径 来保存到 相对本程序路径 的位置)
    //writeToFile为false,则不保存为文件，保存至httpData。
    //返回0正常，<0各种错误
    int download(QUrl url, QString localpath = "", bool writeToFile = true);

    //停止下载
    void stop();

protected:
    //检查URL格式（http或https），URL末尾要有路径
    bool checkURL(QUrl url);


private slots:
    //注意，以下几个函数不一定按顺序触发，比如有可能先finished,再readyRead!!!
    void onReadyRead();                                     //有数据到，要保存下来
    void onDownloadProgress(qint64 a,qint64 b);             //下载进度
    void onFinished(QNetworkReply *reply);                  //完成下载，reply用于接收消息（这个好像不管是否出错，都会调用，所以可以释放reply）
    void onReplyError(QNetworkReply::NetworkError e);       //下载错误
    void onReplySslErrors(const QList<QSslError> &errors);  //下载错误


private:
    Q_DISABLE_COPY(HTTPDownload)



//数据成员
public:
    QByteArray m_baHttpData;    //下载保存的数据

private:
    int m_nWriteType;   //0:写入QByteArray(m_baHttpData),缺省;1:写入文件

    QString m_strLocalFilePathName;   //要保存的本地文件路径和名称
    QFile m_fileOut;     //要写入的文件

    bool m_bHttpDownloadRunning;  //防止用户多次调用m_pNetWorkReply->abort()


    QNetworkReply *m_pNetWorkReply;
    QNetworkRequest m_NetWorkRequest;


    //QNetworkAccessManager *m_netAccessManager;//网络参数
    //QNetworkReply *m_netReply;

    //QUrl m_urlAdress;//网络地址
    //QString m_strFileName;//需要下载的文件名
    //QString m_strDir;//文件的存储位置

    //QFile *m_file;//下载的文件
    //qint64 m_nReceived;//下载文件时，已经接收的文件大小和总共大小
    //qint64 m_nTotal;

};

#endif
